package com.internetCafes.spms.web.job.task.sys;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.internetCafes.spms.web.extend.service.IEntSysMonitorLogService;
import com.internetCafes.spms.web.job.entity.apitest.ApiTestRequestResult;
import com.internetCafes.spms.web.job.utils.SystemMonitorHttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 考试系统定时检测定时器
 * <p>
 *
 * </p>
 *
 * @author Zj 2021/6/29
 */
@Slf4j
@Component
public class SystemMonitorTask {

    @Autowired
    private IEntSysMonitorLogService iEntSysMonitorLogService;

    /**
     * web端考试系统登录接口测试
     */
    @Test
    public void loginForExamWeb() {
        /*doPost();*/
    }

    /**
     * 通过POST方法对系统接口进行请求
     *
     * @param systemName   系统名称
     * @param apiName      接口名称
     * @param apiUrl       接口url
     * @param mobile       通知人手机号
     * @param expectResult 预期接口返回的结果
     * @param paramsJson   请求参数json格式
     */
    public void doPost(String systemName, String apiName, String apiUrl, String mobile, Map<String, String> expectResult, String paramsJson) {
        ApiTestRequestResult apiTestRequestResult = SystemMonitorHttpUtil.sendHttpPostJson(apiUrl, paramsJson);

        resultAnalysis(apiTestRequestResult, systemName, apiName, apiUrl, mobile, expectResult);
    }

    /**
     * 通过GET方法对系统接口进行请求
     *
     * @param systemName   系统名称
     * @param apiName      接口名称
     * @param apiUrl       接口url
     * @param mobile       通知人手机号
     * @param expectResult 预期接口返回的结果
     */
    public void doGet(String systemName, String apiName, String apiUrl, String mobile, Map<String, String> expectResult) {
        // 请求返回结果接收
        ApiTestRequestResult apiTestRequestResult = SystemMonitorHttpUtil.sendHttpGet(apiUrl);

        resultAnalysis(apiTestRequestResult, systemName, apiName, apiUrl, mobile, expectResult);
    }

    /**
     * 接口返回参数解析进行处理
     *
     * @param apiTestRequestResult http请求返回封装的数据
     * @param systemName           系统名称
     * @param apiName              接口名称
     * @param apiUrl               接口url
     * @param mobile               手机号
     * @param expectResult         欲求结果
     */
    public void resultAnalysis(ApiTestRequestResult apiTestRequestResult, String systemName, String apiName, String apiUrl, String mobile, Map<String, String> expectResult) {
        Date currentTime = new Date();
        // 接口请求失败
        if (apiTestRequestResult.getConnectResult()) {
            iEntSysMonitorLogService.addAndSendMessage(systemName, apiName, apiUrl, apiTestRequestResult.getResponseContent(), currentTime, mobile);
        }

        // 接口返回内容进行比较
        Map<String, String> responseMap = (Map<String, String>) JSON.parse(apiTestRequestResult.getResponseContent());
        String responseValue;
        String expectValue;
        Boolean successFlag = true;
        List<String> errorInfo = new ArrayList<>();
        for (Map.Entry<String, String> resultEntry : expectResult.entrySet()) {
            responseValue = responseMap.get(resultEntry.getKey());
            expectValue = resultEntry.getValue();
            if (!expectValue.equals(responseValue)) {
                successFlag = false;
            }
            errorInfo.add(resultEntry.getKey() + StringUtils.UNDERLINE + responseValue);
        }

        // 如果没有成功
        if (!successFlag) {
            // 发送信息
            iEntSysMonitorLogService.addAndSendMessage(systemName, apiName, apiUrl, apiTestRequestResult.getResponseContent(), currentTime, mobile);
        }
    }
}
